/*
 * Copyright (c) 2019. ascend 版权所有禁止转载。
 */

package cn.edu.zua.demo11.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.UUID;

/**
 * 说明：
 *
 * @author ascend
 * 2019/1/24 17:44
 */
@Controller
public class UploadController {

    /**
     * 初始化上传文件界面，跳转到index.jsp
     *
     * @return String
     */
    @GetMapping("index")
    public String index() {
        return "index";
    }

    /**
     * 上传单个文件
     * @param request 请求对象
     * @param file 文件对象
     * @return 上传结果
     */
    @PostMapping("/upload")
    @ResponseBody
    public String upload(HttpServletRequest request, MultipartFile file) {
        try {
            //上传目录地址
            String uploadDir = request.getSession().getServletContext().getRealPath("/") + "upload/";
            //如果目录不存在，自动创建文件夹
            File dir = new File(uploadDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            //调用上传方法
            executeUpload(uploadDir, file);
        } catch (Exception e) {
            e.printStackTrace();
            return "上传失败";
        }
        return "上传成功";
    }

    /**
     * 上传多个文件
     * @param request 请求对象
     * @param file 文件对象集合
     * @return 上传结果
     */
    @PostMapping("/uploads")
    @ResponseBody
    public String uploads(HttpServletRequest request, MultipartFile[] file) {
        try {
            //上传目录地址
            String uploadDir = request.getSession().getServletContext().getRealPath("/") + "upload/";
            //如果目录不存在，自动创建文件夹
            File dir = new File(uploadDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            for (MultipartFile f : file) {
                if (!f.isEmpty()) {
                    //调用上传方法
                    executeUpload(uploadDir, f);
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "上传失败";
        }
        return "上传成功";
    }


    /**
     * 提取上传方法为公共方法
     *
     * @param uploadDir 上传文件目录
     * @param file      上传对象
     * @throws IOException 文件写入异常
     */
    private void executeUpload(String uploadDir, MultipartFile file) throws IOException {
        //文件后缀名
        String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
        //上传文件名
        String filename = UUID.randomUUID() + suffix;
        //服务器端保存的文件对象
        File serverFile = new File(uploadDir + filename);
        //将上传的文件写入到服务器端文件内
        file.transferTo(serverFile);
    }
}
